package caizw.hibernate.base.dao;

import org.hibernate.Session;
import org.hibernate.criterion.Criterion;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

/**
 * @author caizw
 */
public interface Base<T, PK extends Serializable> {

    /**
     * 获取session
     *
     * @return
     */
    Session getSession();

    /**
     * 保存
     *
     * @param entity
     */
    void save(T entity);

    /**
     * 删除
     *
     * @param entity
     */
    void delete(T entity);

    /**
     * 更新
     *
     * @param entity
     */
    void update(T entity);

    /**
     * 更新或保存
     *
     * @param entity
     */
    void saveOrUpdate(T entity);

    /**
     * 根据主键查询
     *
     * @param id
     * @return
     */
    T queryById(PK id);

    /**
     * 获取所有数据
     *
     * @return
     */
    List<T> queryAll();

    /**
     * 通过hql查询
     *
     * @param queryString hql语句
     * @param params      参数
     */
    List<T> queryListByHql(String queryString, Object... params);

    /**
     * 根据HQL语句查询实体
     *
     * @param hql 待查询的HQL语句
     * @return
     */
    List<T> queryByHql(String hql);

    /**
     * in 查询 ，某个字段在某个集合内
     *
     * @param filedName 字段名
     * @param values    集合
     */
    List<T> queryByFiledIn(String filedName, List<? extends Object> values);

    List<T> queryByCriterion(List<Criterion> criterion);

    /**
     * 使用hql 语句进行分页查询操作
     *
     * @param hql      需要查询的hql语句
     * @param pageNo   查询第pageNo页的记录
     * @param pageSize 每页需要显示的记录数
     * @param params   如果hql带占位符参数，params用于传入占位符参数
     * @return 当前页的所有记录
     */
    PageInfo<T> findByPage(String hql, int pageNo, int pageSize, Object... params);

    /**
     * 使用hql 语句进行分页查询操作
     *
     * @param hql      需要查询的hql语句
     * @param pageRow  查询第pageNo页的记录
     * @param pageSize 每页需要显示的记录数
     * @return 当前页的所有记录
     */
    PageInfo<T> findByPage(String hql, int pageRow, int pageSize);

    /**
     * @param pageRow         当前第几页
     * @param pageSize        每页需要显示的记录数
     * @param pram            map 查询条件
     * @param orderColumnName 排序字段
     * @param order           按什么进行排序
     * @return
     */
    PageInfo<T> getPageInfo(Integer pageRow, Integer pageSize, Map<String, Object> pram, String orderColumnName, String order);

}
